Հանգույցային տեսակավորում
Այս հոդվածն աղբյուրների կարիք ունի։ Դուք կարող եք բարելավել հոդվածը՝ գտնելով բերված տեղեկությունների հաստատումը վստահելի աղբյուրներում և ավելացնելով դրանց հղումները հոդվածին։ Անհիմն հղումները ենթակա են հեռացման։ |
Հանգույցային տեսակավորումը տեղում, անկայուն տեսակավորման ալգորիթ է, և համեմատական ալգորիթմ է, որը տեսականորեն օպտիմալ է գլխավոր բազմության գրառումների ընդհանուր քանակի համար, ի տարբերություն այլ տեղում տեսակավորման ալգորիթմների։ Այն հիմնաված է այն գաղափարի վրա, տեղափոխությունը, որը պետք է տեսակավորվի, կարեղ է արտացոլվել ցիկլերերով, որը կարող է առանձին պտտվել տեսակավորված արդյունք տալու համար։
Ի տարբերություն համարյա յուրաքանչյուր մնացած ալգորիթմների, անդամները երբեք գրված չեն լինում բազմության մեջ այլ տեղում, պարզապես նրանց ազդեցության ուղուց դուրս հանելու համար։ Յուրաքանչյուր արժեք գրվում է զրո անգամ, եթե այն արդեն իր ճիշտ դիրքում է, կամ գրվում է մեկ անգամ իր ճիշտ դիրքում։ Սա համապատասխանեցնում է գրառումների մինիմալ քանակը, որը պահանջվում է ավարտուն տեղում տեսակավորման համար։
Գրառումների քանակի մինիմալացումը օգտագործվում է, երբ գրառումներն ավելի խոշոր տվյալների բազմություն դարձնելը շատ թանկ է, ինչպես օրինակ EEPROM-ի դեպքում կամ որտեղ որ յուրաքանչյուր գրառում փոքրացնում է հիշողության գոյության տևողությունը, ինչպես օրինակFlash հիշողության դեպքում։
Ալգորիթմ
[խմբագրել | խմբագրել կոդը]Հետևյալ ալգորիթմը գտնում և պտտեցնում է ցիկլեր, որոնք տալիս են տեսակավորված արդյունք։ Նշենք, որ range(a, b) գտնվում է a ից b ‑ 1 միջակայքում։
# Sort an array in place and return the number of writes.
def cycleSort(array):
writes = 0
# Loop through the array to find cycles to rotate.
for cycleStart in range(0, len(array) - 1):
item = array[cycleStart]
# Find where to put the item.
pos = cycleStart
for i in range(cycleStart + 1, len(array)):
if array[i] < item:
pos += 1
# If the item is already there, this is not a cycle.
if pos == cycleStart:
continue
# Otherwise, put the item there or right after any duplicates.
while item == array[pos]:
pos += 1
array[pos], item = item, array[pos]
writes += 1
# Rotate the rest of the cycle.
while pos != cycleStart:
# Find where to put the item.
pos = cycleStart
for i in range(cycleStart + 1, len(array)):
if array[i] < item:
pos += 1
# Put the item there or right after any duplicates.
while item == array[pos]:
pos += 1
array[pos], item = item, array[pos]
writes += 1
return writes
Հատուկ իրավիճակների օպտիմալացում
[խմբագրել | խմբագրել կոդը]Երբ բազմությունը պարունակում է համեմատաբար փոքր քանակի կրկնօրինակ անդամներ, a հաստատուն ժամանակով կատարյալ քեշ ֆունկցիան կարող է մեծապես արագացնել, թե որտեղ դնել 1 անդամը, որը փոխում է տեսակավորումը Θ(n2)-ից Θ(n + k) անգամ, որտեղ k-ն քեշերի ընդհանուր թիվն է։ Բազմությունը մինչև վերջ տեսակավորվում է քեշերի կարգով, այսպիսով մի քեշ ֆունկցիայի ընտրությունը, որը քեզ տալիս է ճիշտ կարգավորություն, կարևոր է։
Մինչ տեսակավորումը, պետք է ստեղծել հիստոգրամ, տեսակավորված քեշերով, որոնք հաշվում են յուրաքանչյուր քեշի մուտքերի քանակը բազմություն։ Հետո ստեղծվում է աղյուսակ դեպի հիստոգրամ յուրաքանչյուր մուտքի ընդհանուր գումարով։ Ընդհանուր գումարի աղյուսակը այնուհետև պետք է պարունակի յուրաքանչյուր էլեմենտի դիրքը բազմության մեջ։ Էլեմենտների ճիշտ տեղը կարող է գտնվել հաստատուն-ժամանակ քեշավորման և ընդհանուր գումարի փնտրման միջոցով, այլ ոչ թե գծային փնտրումով։